/*
*
* 版权所有 Copyleft(c) 2005
* 刘炯个人工作室 Sharp-Mark Personal Studio
*
* 允许自由使用，复制，修改，传播和贩卖此源程序及其文档，而不必支付任何费用。
* 以上的版权信息必须出现在每一份复制品中。同时这份版权信息和许可声明
* 也必须出现在支持文档中。刘炯个人工作室不对此软件适于那种具体
* 用途做出任何阐述。此代码只作为代码本身提供对其品质不做任何保证。
*
*/

// ChildView.cpp : CChildView 类的实现
//
#pragma once
#include "stdafx.h"
#include "CubeRotate.h"
#include "ChildView.h"

#include ".\childview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CChildView

CChildView::CChildView()
{
}

CChildView::~CChildView()
{
}


BEGIN_MESSAGE_MAP(CChildView, CWnd)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_TIMER()
	ON_WM_CREATE()
END_MESSAGE_MAP()



// CChildView 消息处理程序

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (!CWnd::PreCreateWindow(cs))
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);

	return TRUE;
}

void CChildView::OnPaint() 
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	
	DrawPattern(dc);
}

void CChildView::DrawPattern(CPaintDC& dc)
{
	// 每次旋转角度单位
	const float PI = static_cast<float>(3.1415926 * 2 / _maxcycle);

	 _cube.Rotate(PI * _cycle, PI * _cycle, PI * _cycle);		// 旋转
	 _cube.DrawCube(dc, _origin, _distance);					// 绘制

	//COLORREF oldcolor = _cube.Color();
	//for (int i = _cycle - 1; (i > (_cycle - 5) && i > 0); i--)
	//{
	//	int t = _cycle - i;
	//	_cube.Rotate(PI * i, PI * i, PI * i);
	//	_cube.Color() = _cube.Color() + ( BYTE(25 * t) | ( WORD( BYTE(25 * t) ) << 8 ) | DWORD(BYTE(25 * t) << 16) );
	//	_cube.DrawCube(dc, _origin, _distance);
	//}
	//_cube.Color() = oldcolor;

}

void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
	if(!_timer)	_timer = SetTimer(1, 50, 0);					// 初始化Timer
}

void CChildView::OnTimer(UINT nIDEvent)
{
	if(_maxcycle != _cycle)										// 如果没有转完，就继续转
	{
		// 角度倍数加一
		_cycle++;

		// 重绘窗体
		Invalidate();
		UpdateWindow();
	}
	else
	{
		KillTimer(_timer);

		// 重新设置所有用于旋转的变量
		InitVar();
	}
}

int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	srand((unsigned)time(0));

	// 初始化旋转的场景(Scene)
	SetupScene();

	InitVar();

	return 0;
}

void CChildView::SetupScene()
{
	// 初始化世界坐标
	_origin.SetIdentity();
	_origin.Set(2, 3, 400);
	_distance = 3000;

	// 立方体颜色
	_cube.Color() = RGB(0, 0, 0);
}

void CChildView::InitVar()
{
	_timer = 0;
	_cycle = 0;
	_maxcycle = 50;	// 随机生成总的步数
}